package com.example.springmvc.interceptor;

import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class HandlerInterceptor1 implements HandlerInterceptor {

    // Controller执行前调用此方法
    // 返回true表示继续执行，返回false中止执行
    // 这里可以加入登录校验、权限拦截等
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object arg2) throws Exception{

        // 从request中获取session
        HttpSession session = request.getSession();
        // 从session中获取username
        Object username = session.getAttribute("username");
        Object password = session.getAttribute("password");
        //获取拦截的请求
        HandlerMethod handlerMethod = (HandlerMethod) arg2;
        String method=handlerMethod.getMethod().getName();
        System.out.println("当前拦截的方法为："+method);
        // 判断username是否为null
        if (username != null & password != null) {
            System.out.println(username);
            System.out.println(password);
            //针对跳转修改，修改两个请求进行判断
            if("userEdit".equals(method)||"updateUser".equals(method)){
                //用户名密码为admin则允许修改，否则重定向到用户列表
                if("admin".equals(username)&"admin".equals(password)){
                    System.out.println("超级管理员允许修改");
                    return true;
                }else {
                    System.out.println("普通用户不允许修改");
                    response.sendRedirect(request.getContextPath() + "/userList.action");
                    return false;
                }
            }
            System.out.println("不是修改操作放行");
            return true;
        } else {
            //不拦截登录相关的请求
            if("toLogin".equals(method)||"login".equals(method)){
                System.out.println("请求登录放行");
                return true;
            }
            System.out.println("未登录不放行");
            // 如果为空则跳转到登录页面
            response.sendRedirect(request.getContextPath() + "/toLogin");
        }
        return false;
    }

    // controller执行后但未返回视图前调用此方法
    // 这里可在返回用户前对模型数据进行加工处理，比如这里加入公用信息以便页面显示
    @Override
    public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3) throws Exception{
        System.out.println("HandlerInterceptor1....postHandle,执行后但未返回视图前调用此方法");
    }

    // controller执行后且视图返回后调用此方法
    // 这里可得到执行controller时的异常信息
    // 这里可记录操作日志
    @Override
    public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3) throws Exception{
        System.out.println("HandlerInterceptor1....afterCompletion,执行后且视图返回后调用此方法");
    }

}
